package com.shujia.day20;

import java.lang.reflect.Constructor;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class StudentDemo {
    public static void main(String[] args) throws Exception{
        //通过反射获取一个class文件对应Class对象
        //方式1：在已经有对象的前提下获取
//        Student student = new Student();
//        Class<? extends Student> c1 = student.getClass();
//        Class<? extends Student> c2 = student.getClass();
//        System.out.println(c1==c2);

        //方式2：可以直接通过类名的方式获取
//        Class<Student> c1 = Student.class;
//        Class<Student> c2 = Student.class;
//        System.out.println(c1==c2);

        //方式3：Class.forName()
        Class<?> c1 = Class.forName("com.shujia.day20.Student");
//        Class<?> c2 = Class.forName("com.shujia.day20.Student");
//        System.out.println(c1==c2);

        // 获取类中的构造方法并使用
        // getConstructor() 只能获取某一个公共构造方法
        // public Constructor<T> getConstructor(Class<?>... parameterTypes)
        Constructor<?> cons1 = c1.getConstructor();
//        System.out.println(cons1);
//        Constructor<?> cons2 = c1.getConstructor(String.class,String.class);
//        System.out.println(cons2);
        Constructor<?> cons2 = c1.getDeclaredConstructor(String.class, String.class);
        System.out.println(cons2);
        Constructor<?> cons3 = c1.getDeclaredConstructor(String.class);
        System.out.println(cons3);
        //如何使用获取到的构造方法呢？
        //public T newInstance(Object ... initargs)
        Object o = cons1.newInstance();
        System.out.println(o);
        cons3.setAccessible(true);
        Object o1 = cons3.newInstance("1001");
        System.out.println(o1);

        // 获取类中的成员变量并使用
        //getField 只能获取公共的成员变量
        Field like = c1.getField("like");
//        Field id = c1.getField("id");
        Field id = c1.getDeclaredField("id");
        // 给对象o1中成员变量like进行赋值操作
        like.set(o1, "骑自行车");
        System.out.println(o1);
        id.setAccessible(true);
        id.set(o1,"1002");
        System.out.println(o1);

        // 获取类中的成员放啊并使用
        Method fun1 = c1.getMethod("fun1");
        System.out.println(fun1);
        Method fun11 = c1.getMethod("fun1",String.class);
        System.out.println(fun11);
//        Method fun3 = c1.getMethod("fun3");
//        System.out.println(fun3);
        Method fun3 = c1.getDeclaredMethod("fun3");
        System.out.println(fun3);
        //使用成员方法
        fun1.invoke(o1);
        fun3.setAccessible(true);
        fun3.invoke(o1);

    }
}
